package com.cskaoyan.javase.oop3._2inner._2static._1basic;

/**
 * @description: 静态内部类的访问特点
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 研究之前,还是先明确两点:
 *      1."好兄弟",静态内部类和外围类互相访问,没有权限限制
 *      2.外围类和静态内部类会互相持有对象吗?
 *          没有,它们没有任何关系,也不会互相持有对象,包括类加载都不会互相触发
 *          如果想要互相访问,直接创建对象即可
 *
 * 静态内部类的访问特点
 * - 静态内部类内部访问外围类
 * - 外围类访问静态内部类成员
 *
 * 互相访问时都需要创建对象,如果同名就使用对象名区分
 *
 * - 外部类访问静态内部类成员（了解）
 *      1.不是"好兄弟" 受权限限制
 *      2.要想访问静态内部类,需要先去访问外围类
 *          语法:
 *          EnclosedClazz.InnerClazz ic = new EnclosedClazz.InnerClazz();
 *
 * - 静态内部类访问外部类成员（了解）
 *      1.不是"好兄弟" 受权限限制
 *      2.要创建对象
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        //先访问外围类,再触碰静态内部类
        EnclosedClazz.InnerClazz ic = new EnclosedClazz.InnerClazz();
    }
}

class EnclosedClazz {
    //外围类成员
    int a;
    private int b = 10;
    static int c = 20;
    static final int D = 30;

    public void testEnclosed(){
        //访问内部类成员
        InnerClazz ic = new InnerClazz();
        System.out.println(ic.b);
    }
    public static void testEnclosedStatic(){
        //访问内部类成员
        InnerClazz ic = new InnerClazz();
        System.out.println(ic.b);
    }

    static class InnerClazz {
        //静态内部类成员
        int a;
        private int b = 10;
        static int c = 20;
        static final int D = 30;

        public void testInner(){
            //访问外围类成员
            EnclosedClazz ec = new EnclosedClazz();
            System.out.println(ec.b);
            System.out.println(a);
            System.out.println(b);
        }
        public static void testInnerStatic(){
            //访问外围类成员
            EnclosedClazz ec = new EnclosedClazz();
            System.out.println(ec.b);
        }
    }
}
